iT邦幫忙

2024 iThome 鐵人賽

DAY 16
1
IT 管理

30天從版控到code review的實踐指南系列 第 16

Day.16 Code Review:功能邏輯-上篇

  • 分享至 

  • xImage
  •  

範例:將日期字串格式化為 YYYY-MM-DD 的形式。

原程式碼:

function formatLocalDateTime(originalStr) {
    var result = "";
    if (!originalStr) {
        return result;
    }
    var d = new Date(Date.parse(originalStr.split(" ")[0]));
    var year = d.getFullYear();
    var month = ((d.getMonth() + 1) < 10) ? '0' + (d.getMonth() + 1).toString() : (d.getMonth() + 1).toString();
    var date = ((d.getDate()) < 10) ? '0' + (d.getDate()).toString() : (d.getDate()).toString();
    result = [year, month, date].join("-");
    if (result == '1900-01-01') {
        result = '';
    }
    return result;
}

Code Review 建議:


  1. 有無優於 Date.parse() 解析日期的方法?

    不同瀏覽器,使用 Date.parse() 可能會有不同的解析結果,將導致解析錯誤或無效日期。

    //chrome
    console.log(new Date("09/30/2024")); // Mon Sep 30 2024
    //safari
    console.log(new Date("09/30/2024")); // Invalid Date
    

    建議使用更可靠的方法來解析日期字串,例如利用專門的日期函式庫(如 moment.js 或 Date 的標準方法)。

    //改進方法:使用 Date()
    let d = new Date(originalStr.split(" ")[0]);
    if (isNaN(d.getTime())) return ""; // 檢查日期是否有效
    
    //使用 Date()舉例說明
    let d1 = new Date("2024-09-30");
    let d2 = new Date("invalid-date");
    
    console.log(d1.getTime());  // 有效日期:return 時間戳:1738252800000
    console.log(d2.getTime());  // 無效日期:return NaN
    
  2. 對空字串檢查可以簡化

    if (!originalStr) 已經涵蓋了 null、undefined 和空字串的情況,但這段檢查邏輯過於廣泛。若僅需針對空字串,應改成 if (originalStr === "") 來進行更精確的檢查。

  3. 使用 padStart() 簡化補零邏輯

    //原始的邏輯:手動檢查月份和日期是否小於 10,然後在前面補上 '0'。
    let month = ((d.getMonth() + 1) < 10) ? '0' + (d.getMonth() + 1).toString() : (d.getMonth() + 1).toString();
    let date = (d.getDate() < 10) ? '0' + d.getDate().toString() : d.getDate().toString();
    
    //改進 code ,簡化邏輯:padStart(2, '0') 表示若字串長度小於 2,則在開頭補上 '0'。
    let month = (d.getMonth() + 1).toString().padStart(2, '0');
    let date = d.getDate().toString().padStart(2, '0');
    
    //使用 padStart()舉例說明
    console.log((5).toString().padStart(2, '0'));  // '05'
    console.log((12).toString().padStart(2, '0')); // '12'
    

更新後程式碼:


function formatLocalDateTime(originalStr) {
    if (!originalStr) return "";
    
    let dateStr = originalStr.split(" ")[0];
    
    let d = new Date(dateStr);
    if (isNaN(d.getTime())) return ""; // 無效日期
    
    let year = d.getFullYear();
    let month = (d.getMonth() + 1).toString().padStart(2, '0');
    let date = d.getDate().toString().padStart(2, '0');

    let formattedDate = `${year}-${month}-${date}`;
    
    return formattedDate === "1900-01-01" ? "" : formattedDate;
}

應該再補個後端的例子的,但由於時間的關係,今天就先一個範例給大家參考。相信後天的颱風假可以讓我好好補充一下/images/emoticon/emoticon68.gif要出門上班的大家,小心安全!


上一篇
Day 15. Code Review 原則介紹
下一篇
Day.17 Code Review:功能邏輯-下篇
系列文
30天從版控到code review的實踐指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言